perm filename PW1[2,DBL] blob
sn#016208 filedate 1972-12-17 generic text, type T, neo UTF8
00100 BEGIN
00200 EXPR ENTER();
00300 BEGIN
00400 PRINTSTR '"THE SYSTEM IS STARTED";
00500 S;PRINTSTR '"
00600
00700 PLEASE TYPE IN A REQUEST
00800
00900 ...";
01000 L←READ();
01100 LHOLD←L;
01200 IF NULL(L) THEN RETURN '"THE SYSTEM IS ENDED.";
01300 PRINT D(L);
01400 GO S;
01500 END;
01600 EXPR D(L);
01700 BEGIN NEW FN, A, N, RELATEDF;
01800 I←READINKNOWN();
01900 KNOWNF←IDATA[1];
02000 TARG←IDATA[2];
02100 NARG←IDATA[3];
02200 TRE←IDATA[4];
02300 BA1←IDATA[5];
02400 BA2←IDATA[6];
02500 FN←L[1];
02600 FN2←FN;
02700 A←CDR(L);
02800 N←LENGTH(A);
02850 NVARIABLES←N;
02900 RELATEDF←'(NIL NIL NIL NIL);
03000 IF MEMBER(FN,KNOWNF) THEN RETURN K1(FN,A,N,RELATEDF)
03100 ELSE RETURN K2(FN,A,N,RELATEDF);
03200 END;
03300 EXPR INIT();
03400 BEGIN
03500 UNKNOWN ←'UNKNOWN;
03600 INF←0;
03700 ORD←'(NIL);
03800 PRINTSTR '"TYPE IN HOW DEEPLY WE SHOULD RECURSE BEFORE
03900 GIVING UP AS INFINITE LOOP (I SUGGEST 50) ...";
04000 LIMINFBASE←READ();
04050 LIMINF← LIMINFBASE;
04100 TWICELIMINF ← LIMINF + LIMINF;
04200 TRIPLELIMINF ← LIMINF + TWICELIMINF;
04300 BA1←'(FN CAR CDR IDEN MINUS ATOM LISTP NUMBERP NULL
04400 LIST CONST1 ZERO1
04500 QUOTE EVAL LENGTH NOT HALF SUB1 ADD1 );
04600 BA2←'(CONS PI12 PI22 FN2 LIST PLUS TIMES MEMBER APPEND
04700 GREATERP LESSP EQUAL AND OR NOT);
04800 PRINTSTR '"TYPE IN MESSAGE LEVEL (I SUGGEST 3)...";
04900 MSGLEVEL←READ();
05000 KNOWNF ←'(CAR CDR CONS IDEN
05100 PLUS TIMES MINUS
05200 ATOM LISTP NUMBERP NULL
05300 QUOTE EVAL
05400 LENGTH MEMBER
05500 GREATERP LESSP EQUAL
05600 AND OR NOT
05700 HALF PI12 PI22 ZERO1 ZERO2
05800 CONST1 CONST2 SUB1 ADD1 LIST APPEND FN FN2);
05900 SCHEMA←'(DE FN(L) (COND
06000 ((EQUAL (F1 L) C1) (F2 L))
06100 ((EQUAL (F8 L) C3) (F9 L))
06200 ((OR (GT L) (AND (INFINITY ) ((CAR (GET F4 TARGS)) (F3 L))
06300 ((CAR (GET F6 TARGS)) (F5 L))
06400 ((CAR (GET F7 TARGS)) (F4 (F3 L)))
06500 ((CADR (GET F7 TARGS)) (F6 (F5 L))) ))
06600 (F7 (F4 (F3 L)) (F6 (F5 L))))
06700 (T C2)));
06800 I ← EVAL(SCHEMA);
06900 I←GS2(); I←EVAL(SCHEMA2);
07000 NARGS←'NARGS; TARGS←'TARGS;TRES←'TRES;
07100 RETURN PUTFORM();
07200 END;
07300 EXPR IDEN(A); A;
07400 EXPR HALF(A); A/2;
07500 EXPR K1(FN,A,N,RELATEDF);
07600 BEGIN NEW I;
07700 I← GET(FN,'NARGS);
07800 IF I=N OR I=11 THEN RETURN EVAL(L);
07900 PRINTSTR '"THIS FUNCTION TAKES EXACTLY";
08000 PRIN1(I);
08100 PRINTSTR '" ARGUMENT(S), BUT YOU USED IT WITH";
08200 PRIN1(N); PRINTSTR '"ARGUMENT(S).
08300 ARE WE DEFINING A NEW BUT CLOSELY
08400 RELATED FUNCTION Y OR N ...";
08500 IF READ()='Y THEN RELATEDF[1,1]←FN
08600 ELSE PRINTSTR '"ARE WE DEFINING A NEW FUNCTION HERE OR
08700 NOT Y OR N ..."
08800 ALSO IF READ()='N THEN RETURN '"IGNORING THE REQUEST ENTIRELY";
08900 PRINTSTR '"PICK A NEW FUNCTION NAME TO REPLACE THIS NEWEST USE OF";
09000 PRIN1 FN;
09100 PRINTSTR '"...";
09200 FN←READ();
09300 FN2←FN;
09400 IF MEMBER(FN,KNOWNF) THEN RETURN K1(FN,A,N,RELATEDF)
09500 ELSE RETURN K2(FN,A,N,RELATEDF);
09600 END;
09700 EXPR K2(FN,A,N,RELATEDF);
09800 BEGIN NEW II,I;
09900 PRINTSTR '"READY TO MAKE NEW FUNCTION. DO YOU WANT TO";
10000 PRINTSTR '" CHANGE YOUR REQUEST Y OR N...";
10100 IF READ()='Y THEN RETURN '"VERY WELL. IGNORING
10200 THE REQUEST ENTIRELY";
10300 FOR NEW J←1 TO LENGTH(KNOWNF)-1 DO
10400 PUTPROP(KNOWNF[J],NIL,'RVAL);
10500 F1←NIL; F2←NIL; F3←NIL; F4←NIL; F5←NIL; F6 ←NIL;
10600 F7←NIL; F8←NIL;F9←NIL; F10←NIL; F11←NIL; F12←NIL;
10700 F13←NIL; F14←NIL; F15←NIL; F16←NIL; F17←NIL;
10800 F18←NIL; F19←NIL; EXAMPLE←NIL;
10900 CO←CDR(BA1); CO2 ←CDR(BA2);
11000 ORDER2←<BA2,CO,CO,BA2,CO,CO,BA2,CO,CO,BA2,CO,CO,
11100 BA2,BA2,CO,CO,BA2,CO,CO>;
11200 ORDER←<CO,CO,CO,BA1,CO,BA1,CO2>;
11300 PRINTSTR '"FOR EACH OF THE FOLLOWINGS FUNCTIONS, TYPE
11400 EITHER TH WORD STOP OR A FUNCTION NAME, A SPACE, AND THEN A
11500 1/2/3/4/5, MEANING THAT THE FN. IS DEFINITELY/PROBABLY/POSSIBLY
11600 /PROBABLY NOT/DEFINITELY NOT RELATED TO";
11700 PRIN1 (FN);
11800 PRINT (KNOWNF);
11900 FOR NEW J←1 TO LENGTH(KNOWNF) DO BEGIN
12000 S; I←READ();
12100 IF I= 'STOP THEN GO SSS;
12200 II←READ();
12300 PUTPROP (I, II, 'RVAL);
12400 IF MEMBER(II,'(1 2 3 4)) THEN
12500 RELATEDF[II] ← I CONS RELATEDF[II]
12600 ELSE IF NOT(II=5) THEN
12700 PRINTSTR '"NO,NO! TYPE IN ONE DIGIT FROM 1 TO 5!!!"
12800 ALSO GO S;
12900 SSS; END UNTIL I= 'STOP;
13000 PRINTSTR '"DO YOU THINK RECURSION (OR AN AUXILLIARY FN. WILL
13100 BE REQUIRED HERE Y OR N OR M(FOR MAYBE) ...";
13200 I←READ();
13300 IF I='Y THEN RETURN REC(FN,A,N,RELATEDF)
13400 ELSE RETURN NREC(FN,A,N,RELATEDF,I);
13500 END;
13600 EXPR PUTFORM();
13700 BEGIN NEW ID,NA,TA,TR;
13800 TF←NIL;
13900 IF MAKELISTS()=NIL THEN RETURN PRINTSTR '"MAKELISTS IS NIL";
14200 PF←NIL;
14300 PF[1]←'PF1; PF[2]←'PF2; PF[3]←'PF3; PF[4]← 'PF4;
14400 PF[5]←'PF5; PF[6]←'PF6; PF[7]←'PF7;
14500 PF[8]←'PF8; PF[9]←'PF9; P2F[1]←'P2F1; P2F[2]←'P2F2;
14600 P2F[3]←'P2F3; P2F[4]←'P2F4; P2F[5]←'P2F5; P2F[6]←'P2F6;
14700 P2F[7]←'P2F7; P2F[8]←'P2F8; P2F[9]←'P2F9;
14800 P2F[10]←'P2F10; P2F[11]←'P2F11;
14900 P2F[12]←'P2F12; P2F[13]←'P2F13; P2F[14]←'P2F14;
15000 P2F[15]←'P2F15; P2F[16]←'P2F16; P2F[17]←'P2F17;
15100 P2F[18]←'P2F18; P2F[19]←'P2F19;
15200 FOR NEW I←1 TO LENGTH(KNOWNF) DO BEGIN
15250 ID←KNOWNF[I];
15300 NA←NARG[I];
15400 PUTPROP(ID,NA,'NARGS);
15500 TA←TARG[I];
15600 PUTPROP(ID,TA,'TARGS);
15700 TR←TRE[I];
15800 PUTPROP(ID,TR,'TRES);
15900 FOR NEW J←1 TO 9 DO PUTPROP(ID,TF[J,I],PF[J]);
16000 FOR NEW J←1 TO 19 DO PUTPROP(ID,T2F[J,I],P2F[J]);
16050 END;
16100 PUTPROP('FN,2,'RVAL);
16200 PUTPROP ('FN2,1,'RVAL);
16300 PUTPROP('FALSE,'(ANY),TARGS);
16400 PUTPROP('FALSE2,'(ANY ANY), TARGS);
16600 END;
16700 EXPR MAKELISTS();
16800 BEGIN
16900 NARG ← '(1 1 2 11 11 11 1
17000 1 1 1 1 1 1 1 2 11 11 11 11 11 11 1 2 2 1
17100 2 1 2 1 1 11 2 1 2);
17200 TARG←'((LISTP) (LISTP) (ATOM LISTP) (ANY ANY)
17300 (NUMBER NUMBER) (NUMBER NUMBER)
17400 (NUMBER) (ANY) (ANY) (ANY) (ANY) (ANY) (ANY) (ANY)
17500 (ANY LISTP) (NUMBER NUMBER) (NUMBER NUMBER) (ANY ANY)
17600 (ANY ANY) (ANY ANY) (ANY ANY) (NUMBER) (ANY ANY) (ANY ANY)
17700 (ANY) (ANY ANY) (ANY) (ANY ANY) (NUMBER) (NUMBER)
17800 (ANY) (ANYLIST ANYLIST) (ANY) (ANY ANY));
17900 TRE←'(ANY LISTP LISTP ANY NUMBER NUMBER NUMBER
18000 TF TF TF TF ANY ANY
18100 NUMBER TF TF TF TF TF TF TF NUMBER ANY ANY NUMBER
18200 NUMBER ANY ANY NUMBER NUMBER ANYLIST LIST ANY ANY);
18300 TF[1]← '(7 7 0 5 0 0 14 5 14 14 10 25 14 10 0 0 0 0 0 0
18400 14 10 0 0 25 0 25 0 10 10 14 0 0);
18500 TF[2]← '(10 10 0 5 0 0 14 5 14 14 14 25 14 14 0 0 0 0 0 0
18600 25 10 0 0 10 0 10 0 14 14 7 0 0);
18700 TF[3] ← '(5 7 0 10 0 0 10 14 14 14 14 14 14 14 0 0 0 0 0 0
18800 25 14 0 0 14 0 14 0 7 7 10 0 0);
18900 TF[4] ← '(7 10 0 7 0 0 14 14 14 14 14 14 14 14 0 0 0 0 0 0
19000 14 10 0 0 25 0 25 0 10 10 14 0 5);
19100 TF[5] ← '(7 5 0 10 0 0 10 14 14 14 14 14 14 14 0 0 0 0 0 0
19200 25 14 0 0 14 0 14 0 7 7 7 0 0);
19300 TF[6] ← '(10 7 0 7 0 0 14 14 14 14 14 14 14 14 0 0 0 0 0 0
19400 14 10 0 0 25 0 25 0 10 10 10 0 5);
19500 TF[7] ← '(0 0 5 0 10 10 0 0 0 0 0 0 0 0 25 25 14 25 14 14
19600 0 0 7 7 0 14 0 14 0 0 0 5 0);
19700 TF[8]←TF[1]; TF[9]←TF[2];
19800 I←GETT2F();
19900 RETURN PRINTSTR '"SUCCESFUL END OF MAKELISTS";
20000 END;
20100 EXPR FALSE(A); NIL;
20200 EXPR TRUE(A); T;
20300 EXPR GETEX(N8);
20400 BEGIN NEW I;
20500 N9 ← LENGTH(EXAMPLE) + 1;
20600 IF N9=1 THEN RETURN PRIM(NIL);
20700 S; PRINTSTR '"PLEASE GIVE ME AN EXAMPLE.";
20800 PRINTSTR '" THE ARGUMENT LIST...";
20900 EXAMPLE[N9,1]←READ();
21000 PRINTSTR '"THE FUNCTION VALUE...";
21100 EXAMPLE[N9,2]←READ();
21200 PRINTSTR '"DID YOU MAKE AN ERROR? ";
21300 I←READ();
21400 IF I='Y THEN GO S;
21500 RETURN EXAMPLE[N9];
21600 END;
21700 EXPR PI12(A,B); A;
21800 EXPR PI22(A,B); B;
21900 EXPR ZERO1(A); 0;
22000 EXPR ZERO2(A,B); 0;
22100 EXPR CONST1(A); 1;
22200 EXPR CONST2(A,B); NIL;
22300 EXPR INFINITY();
22400 BEGIN
22500 INF←INF+1;
22600 RETURN LESSP(INF,LIMINF);
22700 END;
22800 EXPR REC(FN,A,N,RELATEDF);
22900 BEGIN
23000 NEW I,II,I1,I2,KK,JJ1,JJ2;
23100 S; PRINTSTR '"WHICH: TYPE AN R(RECURSION), A(AUX.FN.), OR
23200 B(BOTH)...";
23300 I←READ();
23400 IF NOT(MEMBER(I,'(R A B))) THEN
23500 PRINTSTR '"NO,NO!! TYPE R,A, OR B ONLY..."
23600 ALSO GO S;
23700 IF NOT I='R THEN RETURN '"O.K. LET'S WORK ON THE AUX.FN.
23800 TYPE IT IN AS IF IT WERE YOUR REQUEST:";
23900 IF N=2 THEN I←PRIM2() ELSE
24000 I←GETEX(1);
24100 NEX←0;
24200 PRINTSTR '"HOW MANY MORE EXAMPLES WILL YOU GIVE ME
24300 (I SUGGEST 2) ....";
24400 NEX←READ();
24500 FOR NEW KK←1 TO NEX DO II←GETEX(KK+1);
24600 L←CADAR(A);
24700 NEX ← NEX + ONEX;
24800 IF NOT(N=1) THEN RETURN REC2(FN,A,N,RELATEDF);
24900 I←'(ANY);
25000 E←NIL; MA←T; MN←T; MAL←T; EXAMPLE[NEX+2,1]←L;
25100 FOR NEW X←1 TO NEX+1 DO BEGIN E←EXAMPLE[X+1,1];
25200 MA←MA AND ATOM(E); MN←MN AND NUMBER(E);
25300 MAL←MAL AND ANYLIST(E); END;
25400 IF MAL THEN I←'(ANYLIST);
25500 IF MA THEN I←'(ATOM);
25600 IF MN THEN I←'(NUMBER);
25700 PUTPROP('FN,I,'TARGS);
25800 PUTPROP('FN,1,'NARGS);
25900 PUTPROP('FN,'ANY,'TRES);
26000 IHOLD←I;
26100 PRINTSTR '"DO YOU KNOW THE TYPE OF ARGUMENTS
26200 FOR THE FN? MY GUESS IS"; PRINC (IHOLD);
26300 PRINTSTR '"ANSWER Y IF YOU WANT TO MAKE A BETTER GUESS,
26400 N IF YOU THINK THAT IT IS O.K. AS STATED ... ";
26500 I←READ(); IF I='Y THEN BEGIN PRINTSTR '"O.K. TYPE IN ONE
26600 OF TH FOLLOWING WORDS: ANY ANYLIST LISTP NUMBER...";
26700 I←READ();
26800 PUTPROP('FN,<I>,'TARGS);
26900 IHOLD←<I>;
27000 END;
27100 FOR NEW K←1 TO 7 DO
27200 ORD[K]←INTERSECTION(RELATEDF[1]@
27300 RELATEDF[2]@<'FN>@RELATEDF[3]
27400 @RELATEDF[4],ORDER[K]);
27500 ORD[8]←ORD[1]; ORD[9]←ORD[2];
27600 FOR NEW K←1 TO 9 DO ORD[K]←RANK(K,ORD);
27700 PRINTSTR '"DO YOU WANT TO CUT DOWN THE POSSIBILITIES
27800 EVEN FURTHER? Y OR N ..."; I←READ();
27900 IF I='Y THEN FOR NEW X←1 TO 9 DO BEGIN
28000 PRINT (<'ORD,X,ORD[X]>); PRINTSTR '"NOW RETYPE ORD[X]";
28100 I ← READ(); IF NOT(I='S) THEN ORD[X]←I;
28200 END;
28300 IF C1=UNKNOWN THEN C1←T;
28400 IF C3=UNKNOWN THEN C3←T;
28500 I←NIL; II←NIL;
28600 LIMINF←LIMINFBASE;
28700 FOR NEW T1←1 TO LENGTH(ORD[1]) DO BEGIN
28800 F1←ORD[1,T1];
28900 IF GREATERP(MSGLEVEL,0) THEN
29000 PRINT(<1,'T1,T1,'F1,F1,'L,L,'RELATEDF,RELATEDF,'ORD,ORD>);
29100 IF FOR NEW X←2 TO NEX+1 ; AND BEGIN
29200 E←EXAMPLE[X,1];
29300 RETURN EVAL '((CAR (GET F1 TARGS)) E) ;
29400 END AND
29500 (GOODEX=NIL OR F1(GOODEX[1])=C1) THEN
29600 FOR NEW T2←1 TO LENGTH(ORD[2]) DO BEGIN
29700 F2←ORD[2,T2];
29800 IF GREATERP(MSGLEVEL,1) THEN
29900 PRINT(<2,'T2,T2,'F2,F2>);
30000 IF FOR NEW X←2 TO NEX+1; AND BEGIN
30100 E←EXAMPLE[X,1];
30200 RETURN EVAL '((CAR (GET F2 TARGS)) E) ;
30300 END AND
30400 (NOT(GOODEX) OR F2(GOODEX[1])=GOODEX[2]) THEN
30500 FOR NEW T8←1 TO LENGTH(ORD[8]) DO BEGIN
30600 F8←ORD[8,T8];
30700 IF GREATERP(MSGLEVEL,9) THEN PRINT(<8,'T8,T8,'F8,F8>);
30800 IF FOR NEW X←2 TO NEX+1; AND BEGIN
30900 E←EXAMPLE[X,1];
31000 RETURN EVAL '((CAR (GET F8 TARGS)) E); END AND
31100 (GOODEX2=NIL OR F8(GOODEX2[1])=C3) THEN
31200 FOR NEW T9←1 TO LENGTH(ORD[9]) DO BEGIN
31300 F9←ORD[9,T9];
31400 IF GREATERP (MSGLEVEL,10) THEN PRINT(<9,'T9,T9,'F9,F9>);
31500 IF FOR NEW X←2 TO NEX+1; AND BEGIN
31600 E←EXAMPLE[X,1];
31700 RETURN EVAL '((CAR (GET F9 TARGS)) E); END AND
31800 (NOT(GOODEX2) OR F9(GOODEX2[1])=GOODEX2[2]) THEN
31900 FOR NEW T3←1 TO LENGTH(ORD[3]) DO BEGIN
32000 F3←ORD[3,T3];
32100 IF GREATERP(MSGLEVEL,2) THEN
32200 PRINT(<3,'T3,T3,'F3,F3>);
32300 IF FOR NEW X←2 TO NEX+1; AND BEGIN
32400 E←EXAMPLE[X,1];
32500 RETURN ( GT(E) OR EVAL '((CAR (GET F3 TARGS)) E) );
32600 END THEN
32700 FOR NEW T4←1 TO LENGTH(ORD[4]) DO BEGIN
32800 F4←ORD[4,T4];
32900 IF F4='FN THEN LIMINF←TWICELIMINF;
33000 IF GREATERP(MSGLEVEL,3) THEN
33100 PRINT(<4,'T4,T4,'F4,F4,'GETF4TARGS,GET(F4,TARGS)>);
33200 IF FOR NEW X←2 TO NEX+1; AND BEGIN
33300 E←EXAMPLE[X,1];
33400 RETURN ( GT(E) OR EVAL '((CAR (GET F4 TARGS)) (F3 E) )) ;
33500 END THEN
33600 FOR NEW T5←1 TO LENGTH(ORD[5]) DO BEGIN
33700 F5←ORD[5,T5];
33800 IF GREATERP(MSGLEVEL,4) THEN
33900 PRINT (<5,'T5,T5,'F5,F5>);
34000 IF FOR NEW X←2 TO NEX+1; AND BEGIN
34100 E←EXAMPLE[X,1];
34200 RETURN (GT(E) OR EVAL '((CAR (GET F5 TARGS)) E)) ;
34300 END THEN
34400 FOR NEW T6←1 TO LENGTH(ORD[6]) DO BEGIN
34500 F6←ORD[6,T6];
34600 IF F6='FN THEN LIMINF ← TRIPLELIMINF;
34700 IF GREATERP(MSGLEVEL,5) THEN
34800 PRINT (<6,'T6,T6,'F6,F6,'(I HAVE CHOSEN LIMINF TO BE),LIMINF>);
34900 IF FOR NEW X←2 TO NEX+1; AND BEGIN
35000 E←EXAMPLE[X,1];
35100 RETURN ( GT(E) OR EVAL '((CAR (GET F6 TARGS)) (F5 E) )) ;
35200 END THEN
35300 FOR NEW T7←1 TO LENGTH(ORD[7]) DO BEGIN
35400 F7←ORD[7,T7];
35500 IF GREATERP(MSGLEVEL,6) THEN
35600 PRINT (<7,'T7,T7,'F7,F7>);
35700 JJ1← FOR NEW KK←2 TO NEX+2; AND BEGIN E←EXAMPLE[KK,1];
35800 RETURN (GT(E) OR
35900 EVAL('((CAR (GET F7 TARGS)) (F4 (F3 E))))); END;
36000 JJ2← FOR NEW HH←2 TO NEX+2; AND BEGIN E←EXAMPLE[HH,1];
36100 RETURN (GT(E) OR
36200 EVAL ('((CADR (GET F7 TARGS)) (F6 (F5 E)))))
36300 ; END;
36400 IF JJ1 AND JJ2 THEN INF←0
36500 ALSO I← FOR NEW X←2 TO NEX+1; AND BEGIN
36600 INF←0;
36700 E←EXAMPLE[X,1];
36800 RETURN (EXAMPLE[X,2] = EVAL '(FN E) );
36900 END;
37000 IF I THEN PRINTSTR '"
37100 HOORAY, HOORAY!!!
37200 SUCCESS!!
37300 ";
37400 RETURN I;
37500 END UNTIL I
37600 END UNTIL I
37700 END UNTIL I
37800 END UNTIL I
37900 END UNTIL I
38000 END UNTIL I
38100 END UNTIL I
38200 END UNTIL I
38300 END UNTIL I;
38400 IF GREATERP(MSGLEVEL,0) THEN
38500 PRINT <'F123456789,F1,F2,F3,F4,F5,F6,F7,F8,F9,'C1234,C1,C2,C3,C4>;
38600 KNOWNF← FN CONS KNOWNF; TARG ←GET('FN,'TARGS) CONS TARG;
38700 NARG←N CONS NARG; TRE ← GET('FN,'TRES) CONS TRE;
38800 BA1 ← FN CONS BA1; IF GREATERP(MSGLEVEL,2) THEN
38900 PRINT <'KNOWNF,KNOWNF,
39000 'TARGNARGTRE,TARG,NARG,TRE,'BA1,BA1>;
39100 FINALIZE();
39200 PUTPROP(FN,1,NARGS);
39300 PUTPROP(FN,IHOLD,TARGS);
39400 PUTPROP(FN,'(ANY),TRES);
39500 FOR NEW J←1 TO 9 DO PUTPROP(FN,11,PF[J]);
39600 RETURN FN
39700 END;
39800 EXPR GT(E);
39900 OR( GOODEX AND GOODEX[1]=E, GOODEX2 AND GOODEX2[1]=E);
40000 EXPR INTERSECTION(A,B);
40100 BEGIN NEW III;
40200 III←NIL;
40300 FOR NEW JJJ IN A DO
40400 IF MEMBER(JJJ,B) THEN III← III @ <JJJ>;
40500 RETURN III;
40600 END;
40700 EXPR LISTP(A);AND( NOT(ATOM(A)), LENGTH(A) ≥ 1);
40800 EXPR ANY(A); T;
40900 EXPR NUMBER(A); NUMBERP(A);
41000 EXPR ANYLIST(A);OR(NULL(A),NOT(ATOM(A)));
41100 EXPR PRINTMATRIX();
41200 BEGIN NEW J;
41300 PRINTSTR '"FNAME TF1 TF2 TF3 TF4 TF5 TF6 TF7 TF8 TF9";
41400 FOR NEW I IN KNOWNF DO BEGIN
41500 J← FOR NEW K IN PF COLLECT
41600 <GET(I,K)>;
41700 RETURN PRINT (I CONS J);
41800 END;
41900 END;
42000 EXPR PRIM(NIL);
42100 BEGIN NEW I,I1,I2;
42200 GOODEX←NIL;
42300 GOODEX2 ← NIL;
42400 F8←NIL;
42500 F9←NIL;
42600 ONEX ← 0;
42700 F1 ← NIL;
42800 F2 ← NIL;
42900 PRINTSTR '"THERE IS SOME TRIVIAL (PRIMITIVE) CASE (OR TWO).
43000 DO YOU KNOW ANYTHING ABOUT IT? Y OR N ...";
43100 I ← READ();
43200 IF I ='N THEN BEGIN
43300 IF GREATERP(MSGLEVEL,1) THEN PRINTSTR
43400 '"ASSUMING C1 TO BE T, C2 TO BE UNKNOWN";
43500 C1 ← T; C2 ← UNKNOWN;
43600 C3←T; C4←UNKNOWN;
43700 EXAMPLE[1] ← <C1,C2>;
43800 RETURN NIL; END ALSO RETURN NIL;
43900 PRINTSTR '"FOR SOME FUNCTIONS F1,F2 AND SOME CONSTANTS C1,C2
44000 WHEN F1(ARGUMENT)=C1 THEN THE VALUE OF YOUR FN IS C2=F2(ARG)
44100 NOTE: C2 MAY NOT ACTUALLY BE A CONSTANT (JUST TYPE UNKNOWN)
44200
44300 NOW TYPE IN A FUNCTION NAME OR THE WORD NIL FOR F1,F2
44400 AND A CONSTANT OR TH WORD UNKNOWN FOR C1,C2 :
44500 F1 ...";
44600 F1←READ();
44700 PRINTSTR '" F2 ...";
44800 F2 ← READ();
44900 PRINTSTR '" C1 ...";
45000 C1 ← READ();
45100 PRINTSTR '" C2 ...";
45200 C2 ← READ();
45300 EXAMPLE[1] ← <C1,C2>;
45400 PRINTSTR '"CAN YOU GIVE ME AN EXAMPLE OF THIS TRIVIAL CASE? ";
45500 PRINTSTR '"Y OR N ...";
45600 I ← READ();
45700 IF I='Y THEN I←GETEX(2) ALSO ONEX←1 ALSO GOODEX←EXAMPLE[2];
45800 IF GOODEX AND F1 THEN C1←F1(GOODEX[1]);
45900 IF GOODEX AND F2 THEN C2←F2(GOODEX[1]);
46000 PRINTSTR '"IS THERE ANOTHER TRIVIAL CASE? Y OR N...";
46100 I←READ();
46200 IF I='N THEN BEGIN
46300 C3←T; C4←UNKNOWN;
46400 F8←'FALSE; F9←'FALSE;
46500 END
46600 ALSO RETURN NIL;
46700 PRINTSTR '"FOR SOME FUNCTIONS F8,F9, AND SOME CONSTANTS C3,C4
46800 WHEN F8(ARGUMENT)=C3 HEN THE VALUE OF YOUR FUNCTION
46900 IS C3=F9(ARGUMENT)
47000 NOTE: C4 MAY NOT ACTUALLY BE A CONSTANT (SAY UNKNOWN)
47100
47200 AS BEFORE, TYPE IN SOMETHING FOR ....
47300 F8 F9 C3 C4 HERE:";
47400 F8←READ();F9←READ();C3←READ();C4←READ();
47500 PRINTSTR '"CAN YOU GIVE ME AN EXAMPLE OF THIS TRIVIAL CASE?
47600 Y OR N ...";
47700 I←READ();
47800 IF I='Y THEN I←GETEX(3) ALSO ONEX←ONEX+1 ALSO GOODEX2←EXAMPLE[3];
47900 IF GOODEX2 AND F8 THEN C3←F8(GOODEX2[1]);
48000 IF GOODEX2 AND F9 THEN C4←F9(GOODEX2[1]);
48100 RETURN NIL; END;
48200 EXPR RANK(K,LL);
48300 BEGIN NEW VAL, EXCHANGE,TEMP,OLDR,RL;
48400 L←LL;
48500 IF NULL(L[K]) THEN
48600 (IF K=7 THEN RETURN '(PI22) ELSE RETURN '(IDEN));
48700 IF FSUB(K) THEN RETURN <FSUB(K)>;
48800 VAL←NIL;
48900 II←NIL;
49000 II←L[K];
49100 L←II;
49200 LEN ← LENGTH(L);
49300 OLDL←L;
49350 IF NVARIABLES=2 THEN EXCHANGE←PF ALSO PF←P2F;
49400 FOR NEW II ←1 TO LEN DO
49500 BEGIN
49600 I←L[II];
49700 IF MEMBER(I,KNOWNF) AND
49800 GET(I,'RVAL) AND
49900 GET(I, PF[K]) AND NOT(GET(I,PF[K])=0) THEN
50000 VAL[II] ← TIMES( GET(I,PF[K]), GET(I,'RVAL))
50100 ELSE VAL[II] ← 1000;
50200 END;
50300 IF GREATERP(MSGLEVEL,20) THEN
50400 PRINT(<'VAL,VAL,'L,L>);
50500 FOR NEW KOUNTER←1 TO LEN DO
50600 FOR NEW I1←1 TO LEN-1 DO
50700 FOR NEW I2←I1+1 TO LEN DO
50800 IF GREATERP(VAL[I1],VAL[I2]) THEN BEGIN
50900 TEMP←VAL[I1]; VAL[I1]←VAL[I2]; VAL[I2]←TEMP;
51000 TEMP←L[I1]; L[I1]←L[I2]; L[I2]←TEMP;
51100 END;
51200 RL←L;
51250 IF NVARIABLES=2 THEN PF←EXCHANGE;
51300 TEMP← FOR NEW J←1 TO LEN COLLECT
51400 BEGIN IF VAL[J]=1000 THEN RETURN NIL
51500 ELSE RETURN <L[J]>;
51600 END;
51700 L ← TEMP;
51800 IF GREATERP(MSGLEVEL,9) THEN PRINT (<'OLDL,OLDL,'RANKEDL,
51900 RL, 'CHOPPEDL, L>);
52000 RETURN L;
52100 END;
52200 EXPR FINALIZE();
52300 BEGIN
52400 IF F4='FN THEN F4←FN; IF F6='FN THEN F6←FN;
52500 EVAL <'DE, FN, '(L),
52600 <'COND, <<'EQUAL, <F1, 'L>, C1>, <F2,'L>>,
52700 <<'EQUAL, <F8, 'L>, C3>, <F9, 'L>>,
52800 <'T,<F7, <F4, <F3, 'L>>,
52900 <F6, <F5, 'L>>>>>>;
53000 RETURN KEEP();
53100 END;
53200 EXPR PERMANENT();
53300 BEGIN NEW I;
53400 EVAL '(OUTC (OUTPUT DSK: PW1KNOWNF) NIL);
53500 PRINT(<KNOWNF,TARG,NARG,TRE,
53600 BA1,BA2> );
53700 EVAL '(OUTC NIL T);
53800 END;
53900 EXPR KEEP();
54000 BEGIN NEW I;
54100 PRINTSTR '"THE ANSWER TO YOUR REQUEST IS";
54200 PRINT (EVAL(LHOLD));
54300 PRINTSTR '"
54400
54500 DO YOU WISH TO ENTER THIS FUNCTION AS A PERMANENT PART
54600 OF THE SYSTEM? Y OR N...";
54700 I←READ();
54800 IF I='N THEN RETURN NIL;
54900 I← PERMANENT();
55000 IF GREATERP(MSGLEVEL,23) THEN PRINT
55100 (<'KNOWNF,KNOWNF,'TARG,TARG,'NARG,NARG,'TRE,TRE,'BA1,
55200 BA1,'BA2,BA2>);
55300 RETURN NIL; END;
55400 EXPR READINKNOWN();
55500 BEGIN NEW I;
55600 I←EVAL '(INC (INPUT DSK: PW1KNOWNF) NIL);
55700 IDATA←NIL;
55800 IDATA← READ();
55900 I←EVAL '(INC NIL T);
56000 IF GREATERP(MSGLEVEL ,24) THEN PRINT (<'IDATA,
56100 IDATA>);
56200 RETURN NIL; END;
00100 EXPR GETT2F();
00200 BEGIN
00250 T2F←NIL; P2F←NIL;
00300 T2F[1]← '(0 0 14 0 25 25 0 0 0 0 0 0 0 0 25 14 14 25 14
00400 14 0 0 7 7 0 25 0 25 0 0 25 25 0 25);
00500 T2F[2] ← '(10 10 0 7 0 0 25 14 14 14 14 25 25 14 0 0 0 0 0
00600 0 25 14 0 0
00700 25 0 25 0 10 10 25 0 0 0);
00800 T2F[3] ← T2F[2];
00900 T2F[4] ← '(0 0 10 0 25 25 0 0 0 0 0 0 0
01000 0 25 25 25 25 25 25 0 0 7 7 0 25 0
01100 25 0 0 24 14 0 14);
01200 T2F[5] ← '(10 10 0 7 0 0 14 25 25 25 25 25 25 25 0
01300 0 0 0 0 0 25 25 0 0
01400 14 0 10 0 14 14 14 0 0 0);
01500 T2F[6]← '(10 10 0 7 0 0 14 25 25 25 25 25 25 25 0
01600 0 0 0 0 0 25 25 0 0
01700 25 0 10 0 14 14 14 0 0 0);
01800 T2F[7]← T2F[1];
01900 T2F[8]← T2F[2];
02000 T2F[9] ← T2F[3];
02100 T2F[10] ← T2F[4];
02200 T2F[11] ← T2F[5];
02300 T2F[12] ← T2F[6];
02400 T2F[13] ← '(0 0 10 0 25 25 0 0 0 0 0 0 0 0 25 25 25 25 25 14
02500 0 0 14 14 0 25 0 25 0 0 25 20 0 14);
02600 T2F[14] ← '(0 0 14 0 25 25 0 0 0 0 0 0 0 0 25 15 15 15 15 25 0
02700 0 7 10 0 25 0 25 0 0 24 20 0 10);
02800 T2F[15] ← '(7 10 0 10 0 0 14 25 25 25 25 25 25 25 0 0 0 0 0
02900 0 25 25 0 0 25 0 25 0 14 14 0 0 0 0);
03000 T2F[16] ← T2F[15];
03100 T2F[17] ← T2F[14];
03200 T2F[18] ← '(10 7 0 10 0 0 14 25 25 25 25 25 25 25 0 0 0 0 0 0
03300 25 25 0 0 25 0 25 0 14 14 0 0 0 0 );
03400 T2F[19] ← T2F[18];
03500 END;
03600 EXPR GS2();
03700 BEGIN
03800 SCHEMA2 ← '(DE FN2(L M) (COND
03900 ((AND ((CAR (GET F2 TARGS)) L)
04000 ((CAR (GET F3 TARGS)) M)
04100 ((CAR (GET F1 TARGS)) (F2 L))
04200 ((CADR (GET F1 TARGS)) (F3 M))
04300 (EQUAL (F1 (F2 L) (F3 M)) C1)
04400 ((CAR (GET F5 TARGS)) L)
04500 ((CAR (GET F6 TARGS)) M)
04600 ((CAR (GET F4 TARGS)) (F5 L))
04700 ((CADR (GET F4 TARGS)) (F6 M)))
04800 (F4 (F5 L) (F6 M)))
04900 ((AND ((CAR (GET F8 TARGS)) L)
05000 ((CAR (GET F9 TARGS)) M)
05100 ((CAR (GET F7 TARGS)) (F8 L))
05200 ((CADR (GET F7 TARGS)) (F9 M))
05300 (EQUAL (F7 (F8 L) (F9 M)) C3)
05400 ((CAR (GET F11 TARGS)) L)
05500 ((CAR (GET F12 TARGS)) M)
05600 ((CAR (GET F10 TARGS)) (F11 L))
05700 ((CADR (GET F10 TARGS)) (F12 M)))
05800 (F10 (F11 L) (F12 M) ) )
05900
06000 ((OR (GT2 L M)
06100 (AND (INFINITY)
06200 ((CAR (GET F16 TARGS)) M)
06300 ((CAR (GET F15 TARGS)) L)
06400 ((CAR (GET F14 TARGS)) (F15 L))
06500 ((CADR (GET F14 TARGS)) (F16 M))
06600 ((CAR (GET F18 TARGS)) L)
06700 ((CAR (GET F19 TARGS)) M)
06800 ((CAR (GET F17 TARGS)) (F18 L))
06900 ((CADR (GET F17 TARGS)) (F19 M))
07000 ((CAR (GET F13 TARGS))
07100 (SETQ CE1 (F14 (F15 L) (F16 M))))
07200 ((CADR (GET F13 TARGS))
07300 (SETQ CE2 (F17 (F18 L) (F19 M))))))
07400 (F13 CE1 CE2))
07500 (T C2)) );
07600 IF GREATERP(MSGLEVEL, 54) THEN PRINTSTR '" SCHEMA TWO IS";
07700 IF GREATERP(MSGLEVEL, 53) THEN PRINT (SCHEMA2);
07800 RETURN NIL;
07900 END;
08000 EXPR REC2(FN,A,N,RELATEDF);
08100 BEGIN NEW I,II,I1,I2,KK,JJ1,JJ2;
08200 EE1←NIL;
08300 EE2 ← NIL;
08400 L1← NIL;
08500 L2 ← NIL;
08600 E←NIL;
08700 MA←T;
08800 MN←T;
08900 MAL←T;
09000 MA2 ←T;
09100 MN2←T;
09200 MAL2←T;
09300 E1←NIL;
09400 E2←NIL;
09500 EXAMPLE[NEX+2,1]←<L,CADADR(A)>;
09600 FOR NEW X←1 TO NEX+1 DO BEGIN
09700 E1← EXAMPLE[X+1,1,1];
09800 E2← EXAMPLE[X+1,1,2];
09900 MA← MA AND ATOM(E1);
10000 MA2← MA2 AND ATOM(E2);
10100 MN ← MN AND NUMBER(E1);
10200 MN2 ← MN2 AND NUMBER(E2);
10300 MAL ← MAL AND ANYLIST(E1);
10400 MAL2 ← MAL2 AND ANYLIST(E2);
10500 END;
10600 I← '(ANY ANY);
10700 IF MAL THEN I[1] ← 'ANYLIST;
10800 IF MAL2 THEN I[2] ← 'ANYLIST;
10900 IF MA THEN I[1] ← 'ATOM;
11000 IF MA2 THEN I[2] ← 'ATOM;
11100 IF MN THEN I[1] ← 'NUMBER;
11200 IF MN2 THEN I[2] ← 'NUMBER;
11300 PUTPROP ('FN2, I, 'TARGS);
11400 PUTPROP ('FN2, 2, 'NARGS);
11500 PUTPROP ('FN2, 'ANY, 'TRES);
11600 IHOLD← I;
11700 PRINTSTR '"DO YOU KNOW THE TYPE OF ARGUMENTS FOR THE FN?
11800 MY GUESS IS";
11900 PRINC (IHOLD);
12000 PRINTSTR '" ANSWER N MEANS GUESS IS OK,
12100 ANSWER Y MEANS YOU WANT TO CHANGE MY GUESS ...";
12200 I←READ();
12300 IF I='Y THEN BEGIN
12400 PRINTSTR '"TYPE IN TWO OF THE WORDS:
12500 ANY ANYLIST NUMBER LISTP
12600 ( LISTP MEANS A NONNULL LIST)...";
12700 I ← READ();
12800 II ← READ();
12900 IHOLD ← <I,II>;
13000 PUTPROP('FN2, IHOLD, 'TARGS);
13100 END;
13200 FOR NEW K←1 TO 19 DO
13300 ORD[K]←INTERSECTION(RELATEDF[1]@RELATEDF[2]@<'FN2>
13400 @RELATEDF[3]@RELATEDF[4], ORDER2[K]);
13500 FOR NEW K←1 TO 19 DO
13600 ORD[K] ← RANK(K,ORD);
13700 PRINTSTR '"DO YOU WANT TO CUT DOWN THE POSSIBILITIES?";
13800 I←READ();
13900 IF I='Y THEN FOR NEW X←1 TO 19 DO
14000 BEGIN
14100 PRINT <'ORD,X,ORD[X]>;
14200 PRINTSTR '"NOW RETYPE THIS SECTION OF ORD:";
14300 I←READ();
14400 IF NOT(I='S) THEN ORD[X]←I;
14500 END;
14600 IF C1='UNKNOWN THEN C1=T;
14700 IF C3='UNKNOWN THEN C3=T;
14800 I←NIL; II←NIL;
14900 LIMINF←LIMINFBASE;
15000 TAGF1 ← F1;
15100 TAGF7 ← F7;
15200 FOR NEW T2 ← 1 TO LENGTH(ORD[2]) DO BEGIN
15300 F2 ← ORD[2,T2];
15400 IF GREATERP(MSGLEVEL,0) THEN
15500 PRINT <2,'T2,T2,'F2,F2>;
15600 IF GREATERP(MSGLEVEL,49) THEN
15700 PRINT<'L,L,'RELATEDFUNCTIONS,RELATEDF,'ORD,ORD>;
15800 IF FOR NEW X← 2 TO NEX+1; AND
15900 MAT(EXAMPLE[X,1],F2) THEN
16000 FOR NEW T3 ← 1 TO LENGTH(ORD[3]) DO BEGIN
16100 F3←ORD[3,T3];
16200 IF GREATERP(MSGLEVEL,1) THEN
16300 PRINT <3,'T3,T3,'F3,F3>;
16400 IF FOR NEW X←2 TO NEX+1; AND
16500 MAT3(EXAMPLE[X,1],F3) THEN
16600 FOR NEW T1←1 TO LENGTH(ORD[1]) DO BEGIN
16700 F1← ORD[1,T1];
16800 IF GREATERP(MSGLEVEL,2) THEN PRINT <1,'T1,T1,'F1,F1>;
16900 IF FOR NEW X←2 TO NEX+1; AND
17000 MAT2(EXAMPLE[X,1],F1,F2,F3) AND
17100 (TAGF1 OR GOODEX=NIL OR F1(F2 (GOODEX[1,1]),
17200 F3(GOODEX[1,2]))=C1) THEN
17300 FOR NEW T5←1 TO LENGTH(ORD[5]) DO BEGIN
17400 F5 ← ORD[5,T5];
17500 IF GREATERP(MSGLEVEL,4) THEN PRINT<5,'T5,T5,'F5,F5>;
17600 IF FOR NEW X←2 TO NEX+1; AND MAT(EXAMPLE[X,1],F5) THEN
17700 FOR NEW T6←1 TO LENGTH(ORD[6]) DO BEGIN
17800 F6 ← ORD[6,T6];
17900 IF GREATERP(MSGLEVEL,5) THEN PRINT <6,'T6,T6,'F6,F6>;
18000 IF FOR NEW X←2 TO NEX+1; AND MAT3(EXAMPLE[X,1],F6) THEN
18100 FOR NEW T4← 1 TO LENGTH(ORD[4]) DO BEGIN
18200 F4←ORD[4,T4];
18300 IF GREATERP(MSGLEVEL,6) THEN PRINT <4,'T4,T4,'F4,F4>;
18400 IF FOR NEW X←2 TO NEX+1; AND
18500 MAT2(EXAMPLE[X,1],F4,F5,F6) AND
18600 (LENGTH(ORD[4])=1 OR C2=NIL OR C2=UNKNOWN
18700 OR F4(F5(L),F6(M))=C2) THEN
18800 FOR NEW T8←1 TO LENGTH(ORD[8]) DO BEGIN
18900 F8←ORD[8,T8];
19000 IF GREATERP(MSGLEVEL,6) THEN PRINT <8,'T8,T8,'F8,F8>;
19100 IF FOR NEW X←2 TO NEX+1; AND MAT(EXAMPLE[X,1],F8) THEN
19200 FOR NEW T9←1 TO LENGTH(ORD[9]) DO BEGIN
19300 F9 ← ORD[9,T9];
19400 IF GREATERP(MSGLEVEL,7) THEN PRINT <9,'T9,T9,'F9,F9>;
19500 IF FOR NEW X←2 TO NEX+1; AND MAT3(EXAMPLE[X,1],F9) THEN
19600 FOR NEW T7←1 TO LENGTH(ORD[7]) DO BEGIN
19700 F7←ORD[7,T7];
19800 IF GREATERP(MSGLEVEL,8) THEN PRINT <7,'T7,T7,'F7,F7 >;
19900 IF FOR NEW X←2 TO NEX+1; AND
20000 MAT2(EXAMPLE[X,1],F7,F8,F9) AND
20100 (TAGF7 OR GOODEX2=NIL OR
20200 F7(F8(GOODEX2[1,1]),F9(GOODEX2[1,2]))=C3) THEN
20300 FOR NEW T11←1 TO LENGTH(ORD[11]) DO BEGIN
20400 F11←ORD[11,T11];
20500 IF GREATERP(MSGLEVEL,9) THEN PRINT <11,'T11,T11,'F11,F11>;
20600 IF FOR NEW X←2 TO NEX+1; AND MAT(EXAMPLE[X,1],F11) THEN
20700 FOR NEW T12←1 TO LENGTH(ORD[12]) DO BEGIN
20800 F12←ORD[12,T12];
20900 IF GREATERP(MSGLEVEL,10) THEN PRINT <12,'T12,T12,'F12,F12>;
21000 IF FOR NEW X←2 TO NEX+1; AND MAT3(EXAMPLE[X,1],F12) THEN
21100 FOR NEW T10←1 TO LENGTH(ORD[10]) DO BEGIN
21200 F10←ORD[10,T10];
21300 IF GREATERP(MSGLEVEL,11) THEN PRINT <12,'T12,T12,'F12,F12>;
21400 IF FOR NEW X←2 TO NEX+1; AND MAT2(EXAMPLE[X,1],F10,F11,F12) THEN
21500 FOR NEW T15← 1 TO LENGTH(ORD[15]) DO BEGIN
21600 F15← ORD[15,T15];
21700 IF GREATERP(MSGLEVEL,12) THEN PRINT <15,'T15,T15,'F15,F15>;
21800 IF FOR NEW X←2 TO NEX+1; AND MAT(EXAMPLE[X,1],F15) THEN
21900 FOR NEW T16←1 TO LENGTH(ORD[16]) DO BEGIN
22000 F16←ORD[16,T16];
22100 IF GREATERP(MSGLEVEL,13) THEN PRINT <16,'T16,T16,'F16,F16>;
22200 IF FOR NEW X←2 TO NEX+1; AND MAT3(EXAMPLE[X,1],F16) THEN
22300 FOR NEW T14←1 TO LENGTH(ORD[14]) DO BEGIN
22400 F14←ORD[14,T14];
22500 IF GREATERP(MSGLEVEL,14) THEN PRINT <14,'T14,T14,'F14,F14>;
22600 IF FOR NEW X←2 TO NEX+1; AND MAT2(EXAMPLE[X,1],F14,F15,F16) THEN
22700 FOR NEW T18←1 TO LENGTH(ORD[18]) DO BEGIN
22800 F18←ORD[18,T18];
22900 IF GREATERP(MSGLEVEL,15) THEN PRINT <18,'T18,T18,'F18,F18>;
23000 IF FOR NEW X←2 TO NEX+1; AND MAT(EXAMPLE[X,1],F18) THEN
23100 FOR NEW T19←1 TO LENGTH(ORD[19]) DO BEGIN
23200 F19←ORD[19,T19];
23300 IF GREATERP(MSGLEVEL,16) THEN PRINT <19,'T19,T19,'F19,F19>;
23400 IF FOR NEW X←2 TO NEX+1; AND MAT3(EXAMPLE[X,1],F19) THEN
23500 FOR NEW T17←1 TO LENGTH(ORD[17]) DO BEGIN
23600 F17←ORD[17,T17];
23700 IF GREATERP(MSGLEVEL,17) THEN PRINT <17,'T17,T17,'F17,F17>;
23800 IF FOR NEW X←2 TO NEX+1; AND MAT2(EXAMPLE[X,1],F17,F18,F19) THEN
23900 FOR NEW T13←1 TO LENGTH (ORD[13]) DO BEGIN
24000 F13←ORD[13,T13];
24100 IF GREATERP(MSGLEVEL,18) THEN PRINT <13,'T13,T13,'F13,F13>;
24200 I←INNERLOOP();
24300 RETURN I;
24400 END UNTIL I
24500 END UNTIL I
24600 END UNTIL I
24700 END UNTIL I
24800 END UNTIL I
24900 END UNTIL I
25000 END UNTIL I
25100 END UNTIL I
25200 END UNTIL I
25300 END UNTIL I
25400 END UNTIL I
25500 END UNTIL I
25600 END UNTIL I
25700 END UNTIL I
25800 END UNTIL I
25900 END UNTIL I
26000 END UNTIL I
26100 END UNTIL I
26200 END UNTIL I;
26300 IF GREATERP(MSGLEVEL,0) THEN
26400 PRINT <'F1TOF19,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,
26500 F11,F12,F13,F14,F15,F16,F17,F18,F19,'C1234,C1,C2,
26600 C3,C4>;
26700 KNOWNF ← FN2 CONS KNOWNF;
26800 TARG ← GET('FN,'TARGS) CONS TARG;
26900 NARG← N CONS NARG;
27000 TRE ← GET('FN,'TRES) CONS TRE;
27100 BA2 ← FN2 CONS BA2;
27200 IF GREATERP(MSGLEVEL,35) THEN PRINT <'KNOWNF,KNOWNF,
27300 'RELATESDF,RELATEDF,'TARG,TARG,'NARG,NARG,'TRE,
27400 TRE,'BA2,BA2>;
27500 PUTPROP(FN2,2,NARGS);
27600 PUTPROP(FN2,IHOLD,TARGS);
27700 PUTPROP(FN2,'ANY,TRES);
27800 FINALIZE2();
27900 FOR NEW J←1 TO 19 DO PUTPROP(FN2,11,P2F[J]);
28000 RETURN FN2;
28100 END;
28200 EXPR PRIM2();
28300 BEGIN NEW I;
28400 GOODEX ← NIL;
28500 GOODEX2 ← NIL;
28600 ONEX ← 0;
28700 F1 ← NIL;
28800 F12 ← NIL;
28900 F3 ← NIL;
29000 F2 ← NIL;
29100 F4 ← NIL;
29200 F5 ← NIL;
29300 F6 ← NIL;
29400 F7 ← NIL;
29500 F8 ← NIL;
29600 F9←NIL;
29700 F10 ← NIL;
29800 F11 ← NIL;
29900 PRINTSTR '"THERE IS SOME PRIMITIVE CASE (OR TWO).
30000 DO YOU KNOW ANYTHING ABOUT IT? Y OR N...";
30100 I← READ();
30200 IF I='N THEN BEGIN
30300 IF GREATERP(MSGLEVEL,3) THEN PRINTSTR
30400 '"I AM ASSUMING F1 THROUGH F12 TO BE NIL,
30500 C1 AND C3 TO BE T, C2 AND C4 TO BE UNKNOWN";
30600 C1 ←T;
30700 C3← T;
30800 C2← UNKNOWN;
30900 C4 ← UNKNOWN;
31000 EXAMPLE[1] ←<C1,C2>;
31100 RETURN NIL;
31200 END ALSO RETURN NIL;
31300 PRINTSTR '"FOR SOME FUNCTIONS F1,F2,F3,F4,F5,F6,
31400 AND SOME CONSTANT C1, WHEN
31500 F1( F2(ARG1), F3(ARG2) ) = C1 THEN
31600 THE VALUE OF YOUR FUNCTION IS
31700 F4( F5(ARG1), F6(ARG2) ) = C2
31800
31900 NOW TYPE IN NIL OR A FUNCTION NAME FOR F1,F2,F3,F4,F5,F6:";
32000 F1←READ();
32100 F2←READ();
32200 F3←READ();
32300 F4←READ();
32400 F5←READ();
32500 F6←READ();
32600 PRINTSTR '"NOW TYPE IN A CONSTANT OR THE VALUE UNKNOWN FOR C1";
32700 C1←READ();
32800 PRINTSTR '"IF C2 IS A CONSTANT, TYPE IN ITS VALUE. IF IT
32900 IS NOT CONSTANT, OR IF YOU DONT KNOW THE VALUE,TYPE UNKNOWN";
33000 C2←READ();
33100 EXAMPLE[1]←<C1,C2>;
33200 PRINTSTR '"CAN YOU GIVE ME AN EXAMPLE OF THIS
33300 PRIMITIVE CASE? Y OR N...";
33400 I←READ();
33500 IF I='Y THEN I←GETEX(2) ALSO ONEX←1 ALSO GOODEX←EXAMPLE[2];
33600 PRINTSTR '"IS THERE ANOTHER PRIMITICE CASE? Y OR N...";
33700 I←READ();
33800 IF I='N THEN BEGIN
33900 C3←T;
34000 C4←UNKNOWN;
34100 F7←'FALSE2;
34200 F8←'FALSE;
34300 F9←'FALSE;
34400 F10←'FALSE2;
34500 F11←'FALSE;
34600 F12←'FALSE;
34700 END ALSO RETURN NIL;
34800 PRINTSTR '"FOR SOME FUNCTIONS F7,F8,F9,F10,F11,F12,
34900 AND SOME CONSTANT C3, WHEN
35000 F7( F8(ARG1), F9(ARG2) ) = C3 THEN
35100 THE VALUE OF YOUR FUNCTION IS
35200 F10( F11(ARG1), F12(ARG2) ) = C4
35300
35400 NOW TYPE IN NIL OR A FUNCTION NAME FOR F7 THROUGH F12:";
35500 F7←READ();
35600 F8←READ();
35700 F9←READ();
35800 F10←READ();
35900 F11←READ();
36000 F12←READ();
36100 PRINTSTR '"NOW TYPE IN UNKNOWN OR A CONSTANT FOR C3,C4:";
36200 C3←READ();
36300 C4←READ();
36400 PRINTSTR '"CAN YOU GIVE ME AN EXAMPLE OF THIS? Y OR N>>>";
36500 I←READ();
36600 IF I='Y THEN I←GETEX(3) ALSO ONEX←2 ALSO GOODEX2←EXAMPLE[3];
36700 RETURN NIL;
36800 END;
36900 EXPR FSUB(I);
37000 IF I=1 THEN F1
37100 ELSE IF I=2 THEN F2
37200 ELSE IF I=3 THEN F3
37300 ELSE IF I=4 THEN F4
37400 ELSE IF I=5 THEN F5
37500 ELSE IF I=6 THEN F6
37600 ELSE IF I=7 THEN F7
37700 ELSE IF I=8 THEN F8
37800 ELSE IF I=9 THEN F9
37900 ELSE IF I=10 THEN F10
38000 ELSE IF I=11 THEN F11
38100 ELSE IF I=12 THEN F12
38200 ELSE IF I=13 THEN F13
38300 ELSE IF I=14 THEN F14
38400 ELSE IF I=15 THEN F15
38500 ELSE IF I=16 THEN F16
38600 ELSE IF I=17 THEN F17
38700 ELSE IF I=18 THEN F18
38800 ELSE IF I=19 THEN F19
38900 ELSE PRINT <'FSUBERROR,'I,I>;
39000 EXPR FINALIZE2();
39100 BEGIN
39200 FOR NEW I←1 TO 19 DO
39300 IF F1='FN2 THEN F1←FN2;
39400 IF F4='FN2 THEN F4←FN2;
39500 IF F7='FN2 THEN F7←FN2;
39600 IF F10='FN2 THEN F10←FN2;
39700 IF F13='FN2 THEN F13←FN2;
39800 IF F14='FN2 THEN F14←FN2;
39900 IF F17='FN2 THEN F17←FN2;
40000 EVAL <'DE, FN2, '(L M),
40100 <'COND, <<'EQUAL, <F1, <F2, 'L>,<F3,'M>>,C1>,
40200 <F4, <F5, 'L>,<F6, 'M>>>,
40300 <<'EQUAL,<F7,<F8,'L>,<F9,'M>>,C3>,
40400 <F10,<F11,'L>,<F12,'M>>>,
40500 <T,<F13,<F14,<F15,'L>,<F16,'M>>,
40600 <F17,<F18,'L>,<F19,'M>>>>>>;
40700 RETURN KEEP();
40800 END;
40900 EXPR FALSE2(A,B); NIL;
41000 EXPR GT2(L,M); OR(GOODEX AND GOODEX[1,1]=L AND GOODEX[1,2]=M,
41100 GOODEX2 AND GOODEX2[1,1]=L AND GOODEX2[1,2]=M);
41200 EXPR MAT(E ,F);
41300 GT2(CAR(E),CADR(E)) OR
41400 EVAL '((CAR (GET F TARGS)) (CAR E));
41500 EXPR MAT2(E,F,G1,G2);
41600 GT2(CAR(E),CADR(E)) OR
41700 EVAL '((CAR (GET F TARGS)) (G1 (CAR E))) AND
41800 EVAL '((CADR (GET F TARGS)) (G2 (CADR E)));
41900 EXPR MAT3(E,F);
42000 GT2(CAR(E),CADR(E)) OR
42100 EVAL '((CAR (GET F TARGS)) (CADR E));
42200 EXPR INNERLOOP();
42300 BEGIN
42400 I←NIL;
42500 INF←0;
42600 IF FOR NEW X←2 TO NEX+1; AND
42700 BEGIN
42800 L1←EXAMPLE[X,1,1];
42900 L2←EXAMPLE[X,1,2];
43000 I← EVAL '((CAR (GET F13 TARGS))
43100 (SETQ EE1 (F14 (F15 L1) (F16 L2))));
43200 IF I THEN I← EVAL '((CADR (GET F13 TARGS))
43300 (SETQ EE2 (F17 (F18 L1) (F19 L2))));
43400 IF I THEN I←(EVAL '(FN2 EE1 EE2) = EXAMPLE[X,2]);
43500 RETURN I;
43600 END
43700 THEN PRINTSTR '"HOORAY, SUCCESS!!!"
43800 ALSO RETURN I;
43900 END;
44000 END.